downcast.hppnamespace type_safe
{
template <typename T>
struct derived_type;
namespace detail
{
template <typename T>
bool is_safe_downcast(derived_type<T>, const T&);
template <typename Derived, typename Base>
typename std::enable_if<std::is_polymorphic<Base>::value, bool>::type is_safe_downcast(derived_type<Derived>, const Base& obj);
template <typename Derived, typename Base>
typename std::enable_if<!std::is_polymorphic<Base>::value, bool>::type is_safe_downcast(derived_type<Derived>, const Base&);
template <typename Derived, typename Base>
void validate_downcast(const Base& obj) noexcept;
}
template <typename Derived, typename Base>
Derived downcast(Base& obj) noexcept;
template <typename Derived, typename Base>
Derived& downcast(derived_type<Derived>, Base& obj) noexcept;
template <typename Derived, typename Base>
const Derived& downcast(derived_type<Derived>, const Base& obj) noexcept;
}
type_safe::derived_typetemplate <typename T>
struct derived_type
{
};
Tag type to specify the derived type of a ts::downcast.
Pass it as first parameter to the appropriate overload.
type_safe::downcasttemplate <typename Derived, typename Base>
Derived downcast(Base& obj) noexcept;
Casts an object of base class type to the derived class type.
Returns: The object converted as if static_cast<Derived>(obj).
Requires: Base must be a base class of Derived, and the dynamic type of obj must be Derived.
type_safe::downcast(1) template <typename Derived, typename Base>
Derived& downcast(derived_type<Derived>, Base& obj) noexcept;
(2) template <typename Derived, typename Base>
const Derived& downcast(derived_type<Derived>, const Base& obj) noexcept;
Casts an object of base class type to the derived class type.
Returns: The object converted as if static_cast<derived_ref>(obj), where derived_ref is the type of Derived with matching qualifiers.
Requires: Base must be a base class of Derived, and the dynamic type of obj must be Derived.